<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html,
        body {
            height: 100%;
        }

        #root {
            height: 100%;
            overflow: auto;
            position: relative;
        }
    </style>
</head>

<body>
    <div id="root"></div>
    <script>
        'use strict';
        // var obj = {
        //     form: 1,
        //     to: 5,
        //     [Symbol.asyncIterator]: function(){
        //         return {
        //             index: this.form,
        //             last: this.to,
        //             next: function(){
        //                 console.log("next func ",this.index)
        //                 return new Promise((resolve,reject)=>{
        //                     setTimeout(()=>{
        //                         if(this.index<=this.last){
        //                             resolve({done:false,value: this.index++})
        //                         }else{
        //                             resolve({done:true})
        //                         }
        //                     },1000)
        //                 })
        //             }
        //         }
        //     },
        //     [Symbol.asyncIterator]: async function* () {
        //         for (let i = this.form; i <= this.to; i++) {
        //             yield await new Promise((resolve, reject) => {
        //                 setTimeout(() => {
        //                     resolve(i)
        //                 }, 1000)
        //             });
        //         }
        //         return;
        //     },
        //     [Symbol.iterator]: function*(){
        //         for(let i=this.form;i<=this.to;i++){
        //             yield i;
        //         }
        //         return;
        //     }
        // }

        // var test = async()=>{
        //     for await (let v of obj){
        //         console.log(v);
        //     }
        // }
        // test();
        // console.log("----------------------------");
        // for(let v of obj){
        //     console.log(v)
        // }
        class Animal{
            name;
            age=0;
            constructor(name){
                this.name = name;
            }
        }
        class Dog extends Animal{
            // 使用instanceof判断是否属于Dog的时候调用  obj instanceof Dog
            static [Symbol.hasInstance](obj){
                console.log('dog has instance of ',obj);
                // 这里可以通过原型链检查来判断是否属于Dog
                return false;
            }
        }
        class Cat extends Animal{
            // toStringTag 调用默认的toString方法时，返回的标识
            [Symbol.toStringTag]="AnimalCat"
        }
        class Erha extends Dog{
            static [Symbol.hasInstance] = undefined
        }
        var dog = new Dog('dog');
        var cat = new Cat('cat');
        var erha = new Erha('erha');
        console.log(erha instanceof Dog);
        console.log(erha instanceof Erha);
        console.log(erha instanceof Animal);

    </script>
</body>

</html>